/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author jose
 */
@WebServlet(name = "servletConexion", urlPatterns = {"/servletConexion"})
public class servletConexion extends HttpServlet {

    private Connection con;
    private Statement st;
    private ResultSet rs;
    
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet servletConexion</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet servletConexion at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
        
        String sentencia=ObtenerSQL(request);
        servletConexion c = new servletConexion();
        try {
            c.abrirConexion(out);//Solo se realiza una vez
            c.PrepararSentencia();//Solo se realiza una vez
            c.EjecutarConsulta(sentencia);
            c.ProcesarResultadoPorPosicion(out);
            c.cerrarConexion();//Solo se realiza una vez
        } catch (Exception e) {
            System.out.println("Se ha producido una excepción");
        }
        
    }
    
    /**
     * Permite obtener una sentencia SQL a partir de los parámetros recibidos
     * @param request Parámetros recibidos
     * @return SQL correspondiente al modo de ejecución del servlet
     */
    private String ObtenerSQL(HttpServletRequest request)
    {
        String sql="";
        String modo=request.getParameter("modo");
        if (modo.equals("localidades"))
        {
                sql="select po.* from poblaciones po where po.CodigoProvincia=(select pr.CodigoProvincia from provincias pr where pr.Provincia='";
                String provincia=request.getParameter("provincia");
                sql=(sql.concat(provincia)).concat("');");
        }
        else
        {
            if (modo.equals("calles"))
            {
                sql="select ca.* from  callespoblaciones ca where ca.CodPoblacion=(select po.CodigoPoblacion from poblaciones po where po.Poblacion='";
                String poblacion=request.getParameter("poblacion");
                sql=(sql.concat(poblacion)).concat("');");
            }
            else
            {
                if(modo.equals("clientes"))
                {
                    sql="select cl.* from  clientes cl where (cl.CodigoPoblacion=(select po.CodigoPoblacion from poblaciones po where po.Poblacion='";
                    String poblacion=request.getParameter("poblacion");
                    sql=(sql.concat(poblacion)).concat("')) and (cl.CodigoProvincia=(select pr.CodigoProvincia from provincias pr where pr.Provincia='");
                    String provincia=request.getParameter("provincia");
                    sql=(sql.concat(provincia)).concat("'));");
                }
                else
                {
                    if(modo.equals("medicion"))
                    {
                        String cliente=request.getParameter("cliente");
                        String medida=request.getParameter("medida");
                        String hora=request.getParameter("hora");
                        sql="INSERT INTO mediciones (Cliente, FechaHora, KW) VALUES (";
                        sql=(((((sql.concat(cliente)).concat(",")).concat(hora)).concat(",")).concat(medida)).concat(");");
                    }
                    else
                    {
                        //No realiza ninguna acción: Fallo
                        sql=null;
                    }
                }
                
            }
        }
        return sql;
    }

    /**
     * Prepara el código java para lanzar sentencias
     *
     * @throws SQLException Lanza excepción en lugar de capturarla
     */
    public void PrepararSentencia() throws SQLException {
        st = con.createStatement();
    }
    
    /**
     * Establece la conexión con la BD
     *
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public void abrirConexion(PrintWriter out) throws InstantiationException, IllegalAccessException {

        try {
            String userName = "Invitado";
            String password = "liker";

            String url = "jdbc:mysql://127.0.0.1/consumoelectrico";

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(url, userName, password);

            out.println("Conexion a la BD");

        } catch (ClassNotFoundException e) {
            // Error. No se ha encontrado el driver de la BD
            e.printStackTrace();
        } catch (SQLException e) {
            // Error. No se ha podido conectar a la BD
            e.printStackTrace();
        }
    }

    /**
     * Ejecuta cada consulta, recibiendo el nombre de la consulta a devolver
     *
     * @param consulta
     * @throws SQLException
     */
    public void EjecutarConsulta(String consulta) throws SQLException {
        rs = st.executeQuery(consulta);
    }

    /**
     * Cierra la conexión con la BD
     */
    public void cerrarConexion() {
        try {
            con.close();
            System.out.println("Conexion cerrada");
        } catch (SQLException e) {
            System.out.println("Error al cerrar conexion");
        }
    }
    
    public void ProcesarResultadoPorPosicion(PrintWriter out) throws SQLException {
        //rs.beforefirst(); Pone el puntero una posicion antes de la primera posición, de ahí que
        //sea necesario empezar con un .next
        rs.beforeFirst();
        while (rs.next()) {
            out.println(rs.getString(1));
        }
        //Recuperando strings nos curamos en salud, ya que si fuera un entero... siempre podríamos
        //recuperarlo con un parseInt
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
